package com.skyd.core.android.game;

import com.skyd.core.draw.DrawHelper;
import com.skyd.core.vector.Vector2DF;
import com.skyd.core.vector.VectorRect2DF;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.Bitmap.Config;
import android.graphics.drawable.BitmapDrawable;

/**
 * 游戏图像
 * 
 * @author SkyD
 * 
 */
public class GameImage extends GameLeafObject implements IGameImageHolder {
	/**
	 * 初始值为null。 功能注释：显示的图像
	 */
	private BitmapDrawable _Image = null;

	/**
	 * 获取Image。 功能注释：显示的图像
	 * 
	 * @return 当前的BitmapDrawable类型的值
	 */
	public BitmapDrawable getImage() {
		return _Image;
	}

	/**
	 * 设置Image。 功能注释：显示的图像
	 * 
	 * @param value
	 *            要设置的BitmapDrawable类型值
	 */
	public void setImage(BitmapDrawable value) {
		_Image = value;
		getSize().reset(getWidth(), getHeight());
	}

	/**
	 * 设置Image为其默认值(null)。 功能注释：显示的图像
	 */
	public void setImageToDefault() {
		setImage(null);
	}

	/**
	 * 初始值为null。 功能注释：碰撞测试时使用的遮罩图，透明部分表示可交错部分
	 */
	private BitmapDrawable _HitTestMaskImage = null;

	/**
	 * 获取碰撞测试时使用的遮罩图，如为null则直接返回显示图。 功能注释：碰撞测试时使用的遮罩图，透明部分表示可交错部分
	 * 
	 * @return 当前的BitmapDrawable类型的值
	 */
	public BitmapDrawable getHitTestMaskImage() {
		if (_HitTestMaskImage == null)
			return getImage();
		return _HitTestMaskImage;
	}

	/**
	 * 设置HitTestMaskImage。 功能注释：碰撞测试时使用的遮罩图，透明部分表示可交错部分
	 * 
	 * @param value
	 *            要设置的BitmapDrawable类型值
	 */
	public void setHitTestMaskImage(BitmapDrawable value) {
		_HitTestMaskImage = value;
	}

	/**
	 * 设置HitTestMaskImage为其默认值(null)。 功能注释：碰撞测试时使用的遮罩图，透明部分表示可交错部分
	 */
	public void setHitTestMaskImageToDefault() {
		setHitTestMaskImage(null);
	}

	public GameImage() {

	}

	public GameImage(BitmapDrawable bitmapDrawable) {
		setImage(bitmapDrawable);
	}
	
	public GameImage(Context c, int resourceID){
		loadImageFromResource(c, resourceID);
	}
	
	public GameImage(Context c, int resourceID,Config cfg){
		loadImageFromResource(c, resourceID, cfg);
	}

	/**
	 * 从资源中加载BitmapDrawable
	 * 
	 * @param c
	 *            上下文对象
	 * @param resourceID
	 *            资源ID
	 */
	public void loadImageFromResource(Context c, int resourceID) {
//		setImage((BitmapDrawable) c.getResources().getDrawable(resourceID));
		setImage(new BitmapDrawable(DrawHelper.loadBitmap(c, resourceID)));
	}
	
	/**
	 * 从资源中加载BitmapDrawable
	 * 
	 * @param c
	 *            上下文对象
	 * @param resourceID
	 *            资源ID
	 *            @param cgg 选项
	 */
	public void loadImageFromResource(Context c, int resourceID,Config cfg) {
//		setImage(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(), resourceID).copy(cfg, false)));
		setImage(new BitmapDrawable(DrawHelper.loadBitmap(c, resourceID,cfg)));
	}

	/**
	 * 从资源中加载BitmapDrawable
	 * 
	 * @param c
	 *            上下文对象
	 * @param resourceID
	 *            资源ID
	 */
	public void loadHitTestMaskImageFromResource(Context c, int resourceID) {
//		setHitTestMaskImage((BitmapDrawable) c.getResources().getDrawable(
//				resourceID));
		setHitTestMaskImage(new BitmapDrawable(DrawHelper.loadBitmap(c, resourceID)));
	}
	
	/**
	 * 从资源中加载BitmapDrawable
	 * 
	 * @param c
	 *            上下文对象
	 * @param resourceID
	 *            资源ID
	 *            @param cgg 选项
	 */
	public void loadHitTestMaskImageFromResource(Context c, int resourceID,Config cfg) {
//		setHitTestMaskImage(new BitmapDrawable(BitmapFactory.decodeResource(c.getResources(), resourceID).copy(cfg, false)));
		setHitTestMaskImage(new BitmapDrawable(DrawHelper.loadBitmap(c, resourceID,cfg)));
	}

	/**
	 * 获取图像高度
	 * 
	 * @return 图像高度
	 */
	public float getHeight() {
		return _Image.getBitmap().getHeight();
	}

	/**
	 * 获取图像宽度
	 * 
	 * @return 图像宽度
	 */
	public float getWidth() {
		return _Image.getBitmap().getWidth();
	}

	@Override
	protected void drawSelf(Canvas c, Rect drawArea) {
		BitmapDrawable img = getImage();
		try
		{
		synchronized(img){
			img.setAlpha((int) (getDisplayOpacity() * 255));
			img.setAntiAlias(true);
			Vector2DF v = getDrawSize();
			img.setBounds(0, 0, v.getIntX(), v.getIntY());
			img.draw(c);
		}
		}
		catch(Exception e){
			GameMaster.log(this,"绘图失败，图像对象可能为空");
		}
	}

	@Override
	protected void updateSelf() {

	}

	@Override
	public GameImage getDisplayImage() {
		return this;
	}

	/**
	 * 获取显示图像像素值数组
	 * 
	 * @param rect
	 *            要获取像素值的矩形区域
	 * @return 像素值数组
	 */
	public int[] getImagePixels(VectorRect2DF rect) {
		return getImagePixels(rect.getRect());
	}

	/**
	 * 获取显示图像像素值数组
	 * 
	 * @param rect
	 *            要获取像素值的矩形区域
	 * @return 像素值数组
	 */
	public int[] getImagePixels(Rect rect) {
		int[] a = new int[rect.width() * rect.height()];
		getImage().getBitmap().getPixels(a, 0, rect.width(), rect.left,
				rect.top, rect.width(), rect.height());
		return a;
	}

	/**
	 * 获取显示图像像素值数组
	 * 
	 * @return 像素值数组
	 */
	public int[] getImagePixels() {
		int w = getImage().getBitmap().getWidth();
		int h = getImage().getBitmap().getHeight();
		int[] a = new int[w * h];
		getImage().getBitmap().getPixels(a, 0, w, 0, 0, w, h);
		return a;
	}

	/**
	 * 获取碰撞测试遮罩图像像素值数组
	 * 
	 * @param rect
	 *            要获取像素值的矩形区域
	 * @return 像素值数组
	 */
	public int[] getHitTestMaskImagePixels(VectorRect2DF rect) {
		return getHitTestMaskImagePixels(rect.getRect());
	}

	/**
	 * 获取碰撞测试遮罩图像像素值数组
	 * 
	 * @param rect
	 *            要获取像素值的矩形区域
	 * @return 像素值数组
	 */
	public int[] getHitTestMaskImagePixels(Rect rect) {
		int[] a = new int[rect.width() * rect.height()];
		getHitTestMaskImage().getBitmap().getPixels(a, 0, rect.width(),
				rect.left, rect.top, rect.width(), rect.height());
		return a;
	}

	/**
	 * 获取碰撞测试遮罩图像像素值数组
	 * 
	 * @return 像素值数组
	 */
	public int[] getHitTestMaskImagePixels() {
		int w = getHitTestMaskImage().getBitmap().getWidth();
		int h = getHitTestMaskImage().getBitmap().getHeight();
		int[] a = new int[w * h];
		getHitTestMaskImage().getBitmap().getPixels(a, 0, w, 0, 0, w, h);
		return a;
	}
	
	/**
	 * 释放并通知回收图像，如果Image为null则不进行任何操作
	 */
	public void releaseImage()
	{
		if(getImage()!=null)
		{
			_Image.getBitmap().recycle();
			_Image=null;
		}
	}
}
